package br.com.aspas.persistencia;

import br.com.aspas.modelo.PessoaFisica;
import br.com.aspas.modelo.PessoaFisicaJuridicaEvento;
import br.com.aspas.util.AbstractDAO;
import java.util.Date;
import java.util.List;
import javax.persistence.Query;

public class PessoaFisicaDao extends AbstractDAO {

    public void inserir(PessoaFisica pessoaFisica) {
        pessoaFisica.setDataInclusao(new Date());
        pessoaFisica.setDataCadastro(new Date());
        insert(pessoaFisica);
    }

    public PessoaFisica findByPk(Integer pKey) {
        PessoaFisica pf = null;
        try {
            pf = (PessoaFisica) findByPk(PessoaFisica.class, pKey);
        } catch (Exception e) {
            pf = null;
        }
        return pf;
    }

    public Boolean remove(Integer id) {
        delete(id, PessoaFisica.class);
        return new Boolean(true);
    }

    public void altera(PessoaFisica pessoaFisica) {
        pessoaFisica.setDataModificacao(new Date());
        update(pessoaFisica);
    }

    public List<PessoaFisica> findAllPessoaFisica(Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> list = em.createQuery(" SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisica> findAllPessoaFisica(String nome, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> list = em.createQuery(" SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.nome like '%" + nome + "%' " + " and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisica> findPFCpf(String nome, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> list = em.createQuery(" SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.cpf like '" + nome + "' " + " and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisica> findPFCodigo(Integer codigo, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> list = em.createQuery(" SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.codigo =" + codigo + " and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisica> findRg(String nome, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> list = em.createQuery(" SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.rg like '" + nome + "' and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisica> findAllPessoaFisicaEvento(String nome, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> list = em.createQuery(" SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.nome like '%" + nome + "%' and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisicaJuridicaEvento> findAllPessoaFisicaParticipacaoEvento(String nome, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisicaJuridicaEvento> list = em.createQuery(" SELECT object(pe) FROM PessoaFisicaJuridicaEvento as pe INNER JOIN pe.pessoaFisica as pf "
                + " where pf.nome like '%" + nome + "%' and pf.codigo not in ( SELECT pe2.pessoaFisica.codigo FROM PessoaFisicaJuridicaEvento pe2 " +
                " WHERE pe2.evento.codigo = " + evento + " ) "
                + " order by pf.nome asc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisicaJuridicaEvento> findAllPessoaFisicaParticipacaoEventoCPF(String cpf, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisicaJuridicaEvento> list = em.createQuery(" SELECT object(pe) FROM PessoaFisicaJuridicaEvento as pe INNER JOIN pe.pessoaFisica as pf "
                + " where pf.cpf = '" + cpf + "' and pf.codigo not in ( SELECT pe2.pessoaFisica.codigo FROM PessoaFisicaJuridicaEvento pe2 " +
                " WHERE pe2.evento.codigo = " + evento + " ) "
                + " order by pf.nome asc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisicaJuridicaEvento> findAllPessoaFisicaParticipacaoEventoRG(String rg, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisicaJuridicaEvento> list = em.createQuery(" SELECT object(pe) FROM PessoaFisicaJuridicaEvento as pe INNER JOIN pe.pessoaFisica as pf "
                + " where pf.rg = '" + rg + "' and pf.codigo not in ( SELECT pe2.pessoaFisica.codigo FROM PessoaFisicaJuridicaEvento pe2 " +
                " WHERE pe2.evento.codigo = " + evento + " ) "
                + " order by pf.nome asc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisicaJuridicaEvento> findAllPessoaFisicaParticipacaoEventoCodigo(Integer codigo, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisicaJuridicaEvento> list = em.createQuery(" SELECT object(pe) FROM PessoaFisicaJuridicaEvento as pe INNER JOIN pe.pessoaFisica as pf "
                + " where pf.codigo = " + codigo + " and pf.codigo not in ( SELECT pe2.pessoaFisica.codigo FROM PessoaFisicaJuridicaEvento pe2 " +
                " WHERE pe2.evento.codigo = " + evento + " ) "
                + " order by pf.nome asc ").getResultList();
        em.close();
        return list;
    }

    public Boolean findPFCpfExist(String cpf, Integer evento) {
        Boolean verify = null;
        em = emf.createEntityManager();
        List<PessoaFisica> lista = em.createQuery("SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.cpf = '" + cpf + "' and pe.evento.codigo=" + evento + " order by pf.codigo desc ").getResultList();
        if (lista.size() > 0) {
            verify = true;
        } else {
            verify = false;
        }
        em.close();
        return verify;
    }

    public List<PessoaFisica> findPFCpfEvento(String nome, Integer evento) {
        List<PessoaFisica> list = null;
        em = emf.createEntityManager();
        String cpf = null;
        nome = nome.replace(".", "");
        nome = nome.replace("-", "");
        for (int i = 0; i < nome.length(); i++) {
            if (i == 2) {
                cpf = nome.substring(0, 3).concat(".");
            }
            if (i == 5) {
                cpf = cpf + nome.substring(3, 6).concat(".");
            }
            if (i == 8) {
                cpf = cpf + nome.substring(6, 9).concat("-");
            }
            if (i == 9) {
                cpf = cpf + nome.substring(9);
            }
        }
        nome = cpf;
        list = em.createQuery("SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.cpf like '" + nome + "%' and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return list;
    }

    public List<PessoaFisica> findRgEvento(String nome, Integer evento) {
        em = emf.createEntityManager();
        List<PessoaFisica> listPessoaFisica = em.createQuery("SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pf.rg like '" + nome + "' and pe.evento.codigo=" + evento + " "
                + " order by pf.codigo desc ").getResultList();
        em.close();
        return listPessoaFisica;
    }

    public Long findTotal(Integer codEvento) {
        em = emf.createEntityManager();
        Query query = (Query) em.createQuery("SELECT count(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pe.evento.codigo=" + codEvento + " ");
        Long codigo = (Long) query.getSingleResult();
        em.close();
        return codigo;
    }

    public Long findTotalMaterial(Integer codEvento) {
        em = emf.createEntityManager();
        Query query = (Query) em.createQuery("SELECT count(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pe.evento.codigo=" + codEvento + " and pf.statusMaterial=true");
        Long codigo = (Long) query.getSingleResult();
        em.close();
        return codigo;
    }

    public void alteraMaterial(Integer codigoPessoaFisica, Boolean statusMaterial) {
        PessoaFisica pessoaFisica = null;
        pessoaFisica = (PessoaFisica) findByPk(PessoaFisica.class, codigoPessoaFisica);
        pessoaFisica.setStatusMaterial(statusMaterial);
        pessoaFisica.setDataEntregaMaterial(new Date());
        update(pessoaFisica);
    }

    public Long findAllMaterial(Integer codEvento) {
        em = emf.createEntityManager();
        Query query = (Query) em.createQuery("SELECT object(pf) FROM PessoaFisica as pf inner join pf.pessoaFisicaJuridicaEvento as pe "
                + " where pe.evento.codigo=" + codEvento + " and pf.statusMaterial=true");
        Long codigo = (Long) query.getSingleResult();
        em.close();
        return codigo;
    }

    public Integer findTipoInscricao(Integer codigoTipoInscricao) {
        em = emf.createEntityManager();
        Query query = (Query) em.createQuery("SELECT count(p) FROM PessoaFisica p"
                + " where p.tipoInscricao.codigo=" + codigoTipoInscricao + " ");
        Integer codigo = (Integer) query.getSingleResult();
        em.close();
        return codigo;
    }
}

